#include "headfile.h"

// 此处不加volatile 编译优化会将这个计算优化 导致无法使用Delay_ms
volatile uint32_t delay_times = 0;

// 搭配滴答定时器实现的精确ms延时
void Delay_ms(uint32_t ms) {
  delay_times = ms * 32000;
  delay_cycles(delay_times);
}

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     整形数字转字符串 数据范围是 [-32768,32767]
// 参数说明     *str            字符串指针
// 参数说明     number          传入的数据
// 返回参数     void
// 使用示例     func_int_to_str(data_buffer, -300);
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void func_int_to_str(char *str, int32_t number) {
  uint8_t data_temp[16]; // 缓冲区
  uint8_t bit = 0;       // 数字位数
  int32_t number_temp = 0;
  do {
    if (NULL == str) {
      break;
    }

    if (0 > number) // 负数
    {
      *str++ = '-';
      number = -number;
    } else if (0 == number) // 或者这是个 0
    {
      *str = '0';
      break;
    }

    while (0 != number) // 循环直到数值归零
    {
      number_temp = number % 10;
      data_temp[bit++] = abs(number_temp); // 倒序将数值提取出来
      number /= 10;                        // 削减被提取的个位数
    }
    while (0 != bit) // 提取的数字个数递减处理
    {
      *str++ = (data_temp[bit - 1] +
                0x30); // 将数字从倒序数组中倒序取出 变成正序放入字符串
      bit--;
    }
  } while (0);
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     整形数字转字符串 数据范围是 [0,65535]
// 参数说明     *str            字符串指针
// 参数说明     number          传入的数据
// 返回参数     void
// 使用示例     func_uint_to_str(data_buffer, 300);
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
void func_uint_to_str(char *str, uint32_t number) {
  int8_t data_temp[16]; // 缓冲区
  uint8_t bit = 0;      // 数字位数

  do {
    if (NULL == str) {
      break;
    }

    if (0 == number) // 这是个 0
    {
      *str = '0';
      break;
    }

    while (0 != number) // 循环直到数值归零
    {
      data_temp[bit++] = (number % 10); // 倒序将数值提取出来
      number /= 10;                     // 削减被提取的个位数
    }
    while (0 != bit) // 提取的数字个数递减处理
    {
      *str++ = (data_temp[bit - 1] +
                0x30); // 将数字从倒序数组中倒序取出 变成正序放入字符串
      bit--;
    }
  } while (0);
}
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     浮点数字转字符串
// 参数说明     *str            字符串指针
// 参数说明     number          传入的数据
// 参数说明     point_bit       小数点精度
// 返回参数     void
// 使用示例     func_double_to_str(data_buffer, 3.1415, 2); // 结果输出
// data_buffer = "3.14" 备注信息
//-------------------------------------------------------------------------------------------------------------------
void func_double_to_str(char *str, double number, uint8_t point_bit) {
  int data_int = 0;        // 整数部分
  int data_float = 0.0;    // 小数部分
  int data_temp[12];       // 整数字符缓冲
  int data_temp_point[9];  // 小数字符缓冲
  uint8_t bit = point_bit; // 转换精度位数

  do {
    if (NULL == str) {
      break;
    }

    // 提取整数部分
    data_int = (int)number; // 直接强制转换为 int
    if (0 > number)         // 判断源数据是正数还是负数
    {
      *str++ = '-';
    } else if (0.0 == number) // 如果是个 0
    {
      *str++ = '0';
      *str++ = '.';
      *str = '0';
      break;
    }

    // 提取小数部分
    number = number - data_int; // 减去整数部分即可
    while (bit--) {
      number = number * 10; // 将需要的小数位数提取到整数部分
    }
    data_float = (int)number; // 获取这部分数值

    // 整数部分转为字符串
    bit = 0;
    do {
      data_temp[bit++] = data_int % 10; // 将整数部分倒序写入字符缓冲区
      data_int /= 10;
    } while (0 != data_int);
    while (0 != bit) {
      *str++ = (abs(data_temp[bit - 1]) +
                0x30); // 再倒序将倒序的数值写入字符串 得到正序数值
      bit--;
    }

    // 小数部分转为字符串
    if (point_bit != 0) {
      bit = 0;
      *str++ = '.';
      if (0 == data_float)
        *str = '0';
      else {
        while (0 != point_bit) // 判断有效位数
        {
          data_temp_point[bit++] = data_float % 10; // 倒序写入字符缓冲区
          data_float /= 10;
          point_bit--;
        }
        while (0 != bit) {
          *str++ = (abs(data_temp_point[bit - 1]) +
                    0x30); // 再倒序将倒序的数值写入字符串 得到正序数值
          bit--;
        }
      }
    }
  } while (0);
}
